package org.dromara.app.service;

import org.dromara.app.domain.bo.AppOperLogBo;
import org.dromara.app.domain.vo.AppOperLogVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;

/**
 * App端操作日志Service接口
 *
 * @author ruoyi
 */
public interface AppOperLogService {

    /**
     * 查询App端操作日志
     */
    AppOperLogVo queryById(Long operId);

    /**
     * 查询App端操作日志列表
     */
    TableDataInfo<AppOperLogVo> queryPageList(AppOperLogBo bo, PageQuery pageQuery);

    /**
     * 查询App端操作日志列表
     */
    List<AppOperLogVo> queryList(AppOperLogBo bo);

    /**
     * 新增App端操作日志
     */
    Boolean insertByBo(AppOperLogBo bo);

    /**
     * 修改App端操作日志
     */
    Boolean updateByBo(AppOperLogBo bo);

    /**
     * 校验并批量删除App端操作日志信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 记录操作日志
     *
     * @param title 模块标题
     * @param businessType 业务类型
     * @param method 方法名称
     * @param requestMethod 请求方式
     * @param operName 操作人员
     * @param operUrl 请求URL
     * @param operIp 主机地址
     * @param operLocation 操作地点
     * @param operParam 请求参数
     * @param jsonResult 返回参数
     * @param status 操作状态
     * @param errorMsg 错误消息
     * @param costTime 消耗时间
     */
    void recordOperLog(String title, Integer businessType, String method, String requestMethod,
                      String operName, String operUrl, String operIp, String operLocation,
                      String operParam, String jsonResult, Integer status, String errorMsg, Long costTime);

    /**
     * 根据操作人查询操作日志
     *
     * @param operName 操作人员
     * @return 操作日志列表
     */
    List<AppOperLogVo> queryByOperName(String operName);

    /**
     * 清空操作日志
     */
    void cleanOperLog();

    /**
     * 根据时间范围删除操作日志
     *
     * @param beginTime 开始时间
     * @param endTime 结束时间
     */
    void deleteOperLogByTime(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取操作统计信息
     *
     * @param operName 操作人员
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    Long getOperLogCount(String operName, LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取用户行为分析数据
     *
     * @param operName 操作人员
     * @param days 统计天数
     * @return 行为分析数据
     */
    List<AppOperLogVo> getUserBehaviorAnalysis(String operName, Integer days);

    /**
     * 获取热门操作统计
     *
     * @param days 统计天数
     * @param limit 返回数量限制
     * @return 热门操作列表
     */
    List<AppOperLogVo> getPopularOperations(Integer days, Integer limit);

    /**
     * 获取错误操作统计
     *
     * @param days 统计天数
     * @return 错误操作列表
     */
    List<AppOperLogVo> getErrorOperations(Integer days);

    /**
     * 批量记录操作日志
     *
     * @param operLogs 操作日志列表
     */
    void batchInsertOperLog(List<AppOperLogBo> operLogs);

    /**
     * 异步记录操作日志
     *
     * @param bo 操作日志业务对象
     */
    void asyncRecordOperLog(AppOperLogBo bo);

}